package com.schezhi.link.auth.constant;

import java.util.Set;

/**
 * 数据权限枚举类
 */
public enum DataPermissionEnum {

    /** 全部可见（无限制） */
    ALL("all", "全部可见") {
        @Override
        public boolean hasPermission(Long userId, Long dataOwnerId, Set<Long> deptIds, Set<Long> dataOwnerDeptIds) {
            return true; // 无限制
        }
    },
    /** 仅本人可见 */
    SELF("self", "本人可见") {
        @Override
        public boolean hasPermission(Long userId, Long dataOwnerId, Set<Long> deptIds, Set<Long> dataOwnerDeptIds) {
            return userId != null && userId.equals(dataOwnerId);
        }
    },
    /** 所在部门及子级部门可见 */
    DEPT_AND_CHILD("dept_and_child", "部门及子级可见") {
        @Override
        public boolean hasPermission(Long userId, Long dataOwnerId, Set<Long> userDeptIds, Set<Long> dataOwnerDeptIds) {
            // 用户所在部门与数据所属部门有交集
            if (userDeptIds == null || dataOwnerDeptIds == null) {
                return false;
            }
            return userDeptIds.stream().anyMatch(dataOwnerDeptIds::contains);
        }
    };
    private final String code;
    private final String desc;
    DataPermissionEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public String getCode() {
        return code;
    }
    public String getDesc() {
        return desc;
    }
    /**
     * 检查用户是否有权限访问数据
     *
     * @param userId           当前用户ID
     * @param dataOwnerId      数据所有者ID
     * @param userDeptIds      用户所在部门ID集合（含子部门）
     * @param dataOwnerDeptIds 数据所属部门ID集合（含子部门）
     * @return 是否有权限
     */
    public abstract boolean hasPermission(
            Long userId,
            Long dataOwnerId,
            Set<Long> userDeptIds,
            Set<Long> dataOwnerDeptIds
    );
    // --- 工具方法 ---

    /**
     * 根据code获取枚举
     */
    public static DataPermissionEnum getByCode(String code) {
        for (DataPermissionEnum value : values()) {
            if (value.getCode().equals(code)) {
                return value;
            }
        }
        throw new IllegalArgumentException("未知的数据权限类型: " + code);
    }
}